# -*-* encoding:UTF-8 -*-
# author            : mengy
# date              : 2019/1/28
# python-version    : Python 3.7.0
# description       : 数据库连接工具（连接池）

import pymysql, uuid, time
from DBUtils.PooledDB import PooledDB
from com.articles.microapp.config.config import CONFIG
from com.articles.microapp.utils.constants import CommonConstants as consts
from com.articles.microapp.utils.logger_utils import Logger

DB = CONFIG.config()
logger = Logger()


class DbUtils(object):
    __database = None

    def __init__(self):
        self.conn = self.__get_connection()
        self.cursor = self.conn.cursor()


    def __get_connection(self):
        if self.__database is None:
            logger.info(u'从数据库连接池获取数据库连接...')
            self.__database = PooledDB(pymysql, 10, host=DB.get_value(section=consts.DB_SCTION, name=consts.DB_URL),
                                       user=DB.get_value(section=consts.DB_SCTION, name=consts.DB_USERNAME),
                                       passwd=DB.get_value(section=consts.DB_SCTION, name=consts.DB_PASSWORD),
                                       db=DB.get_value(section=consts.DB_SCTION, name=consts.DB_NAME),
                                       port=int(DB.get_value(section=consts.DB_SCTION, name=consts.DB_PORT)))
        return self.__database.connection()

    def get_conn(self):
        conn = self.__get_connection()
        cursor = conn.cursor()
        return conn, cursor

    def close(self):
        self.cursor.close()
        self.conn.close()
        # logger.info(u'关闭连接')

    @staticmethod
    def db_util():
        return DbUtils()

    def execute(self, sql, params=(), auto_close=False):
        try:
            conn, cursor = self.get_conn()
            if params:
                cursor.execute(sql, params)
            else:
                cursor.execute(sql)
            conn.commit()
            if auto_close:
                self.close()
        except Exception as e:
            logger.error(u'执行SQL失败，异常:%s', e)
        return conn, cursor

    @staticmethod
    def __formate(cursor):
        result = []
        values = cursor.fetchall()
        keys = cursor.description
        for i in range(len(values)):
            row = {}
            for j in range(len(keys)):
                row[keys[j][0]] = values[i][j]
            result.append(row)
        return result

    def selectall(self, sql, params=()):
        """
        查询多条结果 \n
        :param sql: 查询SQL语句
        :param params: 查询参数
        :return: list[dict]
        """
        try:
            conn, cursor = self.execute(sql, params)
            result = self.__formate(cursor)
            self.close()
            return result
        except Exception as e:
            logger.error(u'查询异常，%s', e)
            self.close()
            return None

    def selectone(self, sql, params=()):
        """
        查询单条结果 \n
        :param sql: 查询SQL语句
        :param params: 查询语句
        :return: dict
        """
        try:
            conn, cursor = self.execute(sql, params)
            result = self.__formate(cursor)
            self.close()
            return result[0]
        except Exception as e:
            logger.error(u'查询异常，%s',e)
            self.close()
            return None

    def insert(self, sql, params=()):
        """
        插入数据 \n
        :param sql: 执行SQL
        :param params:  插入参数
        :return: bool
        """
        try:
            conn, cursor = self.execute(sql, params)
            id = cursor.lastrowid
            logger.info('最新id   ' + str(id))
            conn.commit()
            self.close()
            if id == 0:
                return True
            raise Exception('插入异常')
        except Exception as e:
            logger.error(u'插入失败，%s',e)
            conn.rollback()
            self.close()
            return False

    def update(self, sql, params=()):
        """
        更新数据 \n
        :param sql: 待执行SQL
        :param params: 更新参数
        :return: bool
        """
        try:
            conn, cursor = self.execute(sql, params)
            self.close()
            return True
        except Exception as e:
            logger.error(u'更新失败！%' ,e)
            conn.rollback()
            self.close()
            return False

    def delete(self, sql, params=()):
        """
        删除记录
        :param sql: 待执行SQL
        :param params:  限定参数
        :return:  bool
        """
        try:
            conn, cursor = self.execute(sql, params)
            self.close()
            return True
        except Exception as e:
            logger.error(u'删除失败！%' ,e)
            conn.rollback()
            self.close()
            return False


if __name__ == '__main__':
    db_util = DbUtils.db_util()
    # sql = 'select * from user'
    # db_util.selectall(sql)
    sql = '''
    INSERT INTO article (
        articleId,
        articleType,
        articleTag,
        title,
        content,
        date,
        author,
        illustration,
        status,
        createTime,
        modifyTime
    )
    VALUES
        (
            %s,
            %s,
            %s,
            %s,
            %s,
            %s,
            %s,
            %s,
            %s,
            %s,
            %s
        )
    '''
    params = (
        str(uuid.uuid1()), '1', '1', '搜索引擎百度已死', '最近半年使用过百度的朋友，可能会注意到一个现象：你在第一页看到的搜索结果，基本上有一半以上会指向百度自家产品，尤其频繁出现的是“百家号”。'
                                                 '百家号是百度的自媒体平台，刚推出的时候曾经主打过优质作者和高品质内容，后来几经调整，现在成了一个以营销号为主体的内容平台——内容包罗万象，数量很大，质量堪忧。'
                                                 '随手举一个例子。昨天有朋友在微信上给我发来一篇百家号的文章，问我是真是假——'
                                                 '该文声称，美国中情局承认本·拉登和911事件无关，向其家族致歉。我搜索发现，这样的惊天新闻，原来是来自专门生产讽刺性假新闻的洋葱新闻。'
                                                 '目前，这篇刊登在百家号上的假新闻已经获得了超过40万的阅读量。'
                                                 '百家号的信息质量可见一斑。而百度正通过搜索框，不断地将人们的流量导向百家号。'
                                                 '如果你搜索最近的新闻，比如“英国脱欧”，第一页会出现7条结果，第1条是百度百科，第2、4、5、7条全是百家号的文章，只有两条导向百度以外的网站——第3条是和讯，第6条是新浪。'
                                                 '搜索“美国政府关门”，第一页的8条结果中有一半是百家号，其中包括第1条和第2条。'
                                                 '中国2019年的GDP数据昨天公布，我现在（北京时间1月22日上午10点）搜索“中国2019年GDP”，第1、2、4、5条结果全是百家号，其中没有一条能告诉我最新的数据，只有第3条中国经济网的结果是我要找的。'
                                                 ' 顺便说一句，为了排除可能的个性化算法，我是利用Chrome的隐身模式在登出百度账号的情况下搜索的。'
                                                 '如果我们搜索重要的人物呢？比如特朗普。你会发现，第1页的结果分别是：百度百科、百度贴吧、百家号、百家号、百家号、百家号、新浪、百家号、百度百科。'
                                                 '这么多百家号的内容是什么呢？大家看标题体会一下。'
                                                 '再换一个人试试。搜索一下卡舒吉，去年被杀害的沙特记者、《时代》周刊年度人物。结果，第1页全是百度自家的内容：第1、5条是百度百科，其余全是百家号。'
                                                 '再来搜搜别的，比如“小猪佩奇”。第1条是百度家的爱奇艺，第2条是百家号，第3条是搜狐，第4条是百度百科，第5条是百家号。'
                                                 '搜索“人工智能”，先是一连4条广告，然后是百度百科，中间出现了三个其他网站（同花顺、人工智能实验室、爱范儿），然后是百家号、百度百科、百家号、百度贴吧。'
                                                 '如果我们想用百度解决日常生活中的问题，结果会怎样？比如搜索“怎样买高铁票”，前两条结果分别是：百度经验、百度知道，然后才是12306官网，然后是百度经验、高铁网、百家号、百度经验、百度经验。'
                                                 '如果我们想学习呢？试试搜索“怎样写毕业论文”，猜猜搜索结果是怎样？一上来就是两条论文代写广告，然后是百家号、百家号、百家号，然后是两个论文代写网。'
                                                 '也就是说，你要么来看百家号，要么去找论文代写。'
                                                 '总结一下我的实验结果，黄色背景是百度自家内容或广告：'
                                                 '一年前的百度不是这样，五年前、十年前的百度更不是这样。那时百度虽然也有各种各样的问题，但起码，它真的是一个搜索引擎，真的是你探索中文互联网的入口。你问它问题，真的能得到一些比较满意的回答。'
                                                 '但现在，它已经可以改名为“百家号站内搜索”了。'
                                                 '百度何以堕落如此？我们可以找到一些外部因素。由于近些年来中国互联网愈演愈烈的分割和封闭趋势，微信公号、微博、淘宝这些重要的平台都不向百度开放，我们能够从搜索引擎上找到的东西本来就是残缺的。'
                                                 '但最重要的，还是百度自身饮鸩止渴的商业决策。基本上，百度已经不打算好好做一个搜索引擎了，它只想做一个营销号平台，把希望来搜索内容的人全都变为自家的流量，然后变现。'
                                                 '这当然不是什么可持续的商业模式。当人们发现在这里找不到想找的东西，只会越来越少地使用它。百度的这个策略给我的感觉，就像在末日来临前拼命挥霍光财产。'
                                                 '在一家科技媒体工作的朋友足羽在朋友圈预测：2019年会有不少公司在招聘要求里加一条“日常用百度搜索资讯的求职者慎用”。'
                                                 '作为搜索引擎的百度已死。Baidu.com已经不是你寻找中文互联网内容的地方，而是百度自家的站内搜索；它将你引向的不是中文互联网中的优质精神食粮，而是囤积在自家的腐臭变质内容。'
                                                 '写到这里，很是悲哀：偌大的中文互联网竟已堕落到如此境地，连一个搜索引擎都没有了。'
                                                 '罢了。', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()),
        '28045612534', '/resources/images/2.jpg', '00', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()),
        time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
    db_util.insert(sql, params)
